<?php
/**
 * @package php-font-lib
 * @link    https://github.com/PhenX/php-font-lib
 * @author  Fabien Ménager <fabien.menager@gmail.com>
 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 */

namespace isszz\captcha\font\lib\table\type;

use isszz\captcha\font\lib\table\Table;
use isszz\captcha\font\lib\Font;

/**
 * `name` font table.
 *
 * @package php-font-lib
 */
class Name extends Table
{
	private static $header_format = [
		"format"       => self::uint16,
		"count"        => self::uint16,
		"stringOffset" => self::uint16,
	];

	const NAME_COPYRIGHT          = 0;
	const NAME_NAME               = 1;
	const NAME_SUBFAMILY          = 2;
	const NAME_SUBFAMILY_ID       = 3;
	const NAME_FULL_NAME          = 4;
	const NAME_VERSION            = 5;
	const NAME_POSTSCRIPT_NAME    = 6;
	const NAME_TRADEMARK          = 7;
	const NAME_MANUFACTURER       = 8;
	const NAME_DESIGNER           = 9;
	const NAME_DESCRIPTION        = 10;
	const NAME_VENDOR_URL         = 11;
	const NAME_DESIGNER_URL       = 12;
	const NAME_LICENSE            = 13;
	const NAME_LICENSE_URL        = 14;
	const NAME_PREFERRE_FAMILY    = 16;
	const NAME_PREFERRE_SUBFAMILY = 17;
	const NAME_COMPAT_FULL_NAME   = 18;
	const NAME_SAMPLE_TEXT        = 19;

	static $nameIdCodes = [
		0  => "Copyright",
		1  => "FontName",
		2  => "FontSubfamily",
		3  => "UniqueID",
		4  => "FullName",
		5  => "Version",
		6  => "PostScriptName",
		7  => "Trademark",
		8  => "Manufacturer",
		9  => "Designer",
		10 => "Description",
		11 => "FontVendorURL",
		12 => "FontDesignerURL",
		13 => "LicenseDescription",
		14 => "LicenseURL",
		// 15
		16 => "PreferredFamily",
		17 => "PreferredSubfamily",
		18 => "CompatibleFullName",
		19 => "SampleText",
	];

	static $platforms = [
		0 => "Unicode",
		1 => "Macintosh",
		// 2 =>  Reserved
		3 => "Microsoft",
	];

	static $platformSpecific = [
		// Unicode
		0 => [
			0 => "Default semantics",
			1 => "Version 1.1 semantics",
			2 => "ISO 10646 1993 semantics (deprecated)",
			3 => "Unicode 2.0 or later semantics",
		],

		// Macintosh
		1 => [
			0  => "Roman",
			1  => "Japanese",
			2  => "Traditional Chinese",
			3  => "Korean",
			4  => "Arabic",
			5  => "Hebrew",
			6  => "Greek",
			7  => "Russian",
			8  => "RSymbol",
			9  => "Devanagari",
			10 => "Gurmukhi",
			11 => "Gujarati",
			12 => "Oriya",
			13 => "Bengali",
			14 => "Tamil",
			15 => "Telugu",
			16 => "Kannada",
			17 => "Malayalam",
			18 => "Sinhalese",
			19 => "Burmese",
			20 => "Khmer",
			21 => "Thai",
			22 => "Laotian",
			23 => "Georgian",
			24 => "Armenian",
			25 => "Simplified Chinese",
			26 => "Tibetan",
			27 => "Mongolian",
			28 => "Geez",
			29 => "Slavic",
			30 => "Vietnamese",
			31 => "Sindhi",
		],

		// Microsoft
		3 => [
			0  => "Symbol",
			1  => "Unicode BMP (UCS-2)",
			2  => "ShiftJIS",
			3  => "PRC",
			4  => "Big5",
			5  => "Wansung",
			6  => "Johab",
			//  7 => Reserved
			//  8 => Reserved
			//  9 => Reserved
			10 => "Unicode UCS-4",
		],
	];

	protected function _parse()
	{
		$font = $this->getFont();

		$tableOffset = $font->pos();

		$data = $font->unpack(self::$header_format);

		$records = [];
		for ($i = 0; $i < $data["count"]; $i++) {
			$record      = new NameRecord();
			$record_data = $font->unpack(NameRecord::$format);
			$record->map($record_data);

			$records[] = $record;
		}

		$names = [];
		foreach ($records as $record) {
			$font->seek($tableOffset + $data["stringOffset"] + $record->offset);
			$s                      = $font->read($record->length);
			$record->string         = Font::UTF16ToUTF8($s);
			$names[$record->nameID] = $record;
		}

		$data["records"] = $names;

		$this->data = $data;
	}

	protected function _encode()
	{
		$font = $this->getFont();

		/** @var NameRecord[] $records */
		$records       = $this->data["records"];
		$count_records = count($records);

		$this->data["count"]        = $count_records;
		$this->data["stringOffset"] = 6 + $count_records * 12; // 6 => uint16 * 3, 12 => sizeof self::$record_format

		$length = $font->pack(self::$header_format, $this->data);

		$offset = 0;
		foreach ($records as $record) {
			$record->length = mb_strlen($record->getUTF16(), "8bit");
			$record->offset = $offset;
			$offset += $record->length;
			$length += $font->pack(NameRecord::$format, (array)$record);
		}

		foreach ($records as $record) {
			$str = $record->getUTF16();
			$length += $font->write($str, mb_strlen($str, "8bit"));
		}

		return $length;
	}
}
